#!/usr/bin/perl
#si pas le même redpertoire mettre -I a l'appelle de perl suivi du repertoire avec les packages
use strict;
use warnings;
use p_files_with_eval_manager;
use p_index_manager;
use constant NB_CLASSE => 4;


#fonction pour connaitre la case où est le max
sub where_is_the_max{
	if(!exists($_[0][0])){
		return -1;
	}
	my $cpt=0;
	my $max=0;
	while(exists($_[0][$cpt])){
		#print"$_[0][$cpt],\t";
		if($_[0][$cpt]>$_[0][$max]){
			$max=$cpt;
		}
		$cpt++;
	}
	#print"max:$max\n";
	return $max;
}


#traitement des paramètres
if(!exists($ARGV[0])){
	die("Mauvaise utilisation de 1.4-system_de_base.perl, vous devez spécifier le corpus de travail\n");
}
my $MotsSignificatifs;
if(!exists($ARGV[1])){
	print "Nombre de mots significatifs mise par défaut à 10\n";
	$MotsSignificatifs=10;
}elsif($ARGV[1]!~/^[0-9]+$/){
	print "Nombre de mots significatifs \"$ARGV[1]\" incorrect, quatité mise par défaut à 10\n";
	$MotsSignificatifs=10;
}else{
	print "Nombre de mots significatifs mise à $ARGV[1]\n";
	$MotsSignificatifs=$ARGV[1];
}

my $renewIndex = 0;
my $renewEval = 0;
if(exists($ARGV[2])){
	my $cpt=2;
	while(exists($ARGV[$cpt])){
		if($ARGV[$cpt] eq "--renewIndex"){
			$renewIndex=1;
		}elsif($ARGV[$cpt] eq "--renewEval"){
			$renewEval=1;
		}
		$cpt++;
	}
}

print "chargement de l'index\n";
my %index = %{&p_index_manager::get_index($ARGV[0],$renewIndex)};

print "chargement des evals\n";
my %filesWithEval = %{&p_files_with_eval_manager::getFilesWithEval($ARGV[0],10,$renewEval)};
#le format de %filesWithEval est un hash de tableau où une ligne :  note{-1..3} determinée?{0..1} nbPartition{0..($nbPartition-1)}

my $temps=time();
#Apprentissage
my %proba=();
my @qteByClasse=();
#my $sizeVocabulaire=keys(%index);
for my $k (0..NB_CLASSE-1){
	$qteByClasse[$k]=0;
}
for my $klemme( keys(%index)){
	my %hDoc = %{$index{$klemme}};
	$proba{$klemme}=[1];
	for my $k (0..NB_CLASSE-1){
		$proba{$klemme}[$k]=1.1;
	}
	
	for my $kdoc (keys(%hDoc)){
		#si c'est pas un document dans celui utilisé pour le test, et qu'il a une note
		if($filesWithEval{$kdoc}[0]!=-1){
			#on addition à la classe du document pour le klemme le nombre de fois qu'il est dans le document
			$proba{$klemme}[$filesWithEval{$kdoc}[0]]+=$hDoc{$kdoc};
		}
	}
}
#normalisation
for my $klemme(keys(%proba)){
	for my $k (0..NB_CLASSE-1){
		$qteByClasse[$k]+=$proba{$klemme}[$k];
	}
}
for my $klemme(keys(%proba)){
	for my $k (0..NB_CLASSE-1){
		$proba{$klemme}[$k]/=$qteByClasse[$k];
	}
}

#Les mots significatifs
for my $k (0..NB_CLASSE-1){
	my @motImportant=();
	for my $klemme(keys(%proba)){
		my $evaluationEparpillement=0;
		my $moyenne=0;
		
		#formule pour calculer les mots significatifs : (x_i - xMoyenne)²/xMoyenne²
		for my $j (0..NB_CLASSE-1){
			$moyenne+=$proba{$klemme}[$j];
		}
		$moyenne/=NB_CLASSE;
		$evaluationEparpillement=($proba{$klemme}[$k]-$moyenne);
		$evaluationEparpillement/=$moyenne;
		$evaluationEparpillement*=$evaluationEparpillement;
		
		#on enregistre chaque résultat pour chaque mot
		push @motImportant, [$evaluationEparpillement,$klemme];
	}
	my $cpt=$MotsSignificatifs;
	print "For class\t$k\n";
	#<=> comparaison numérique
	#on trie par ordre décroissant
	for my $ArrayLemmeVal(sort {@{$b}[0] <=> @{$a}[0]} @motImportant){
    # on affiche les $cpt premiers résultats
		if($cpt > 0 ){
			print"@{$ArrayLemmeVal}[0]\t:\t@{$ArrayLemmeVal}[1]\n";
			$cpt--;
		}
	}
}
print "Fait en\t" . (time()-$temps) . " secondes\n";










